﻿////////////////////////////////////////////////////////////
//.....ИДЗ по дисциплине Технологии прогораммирования.....//
//......................МОЗАИКА...........................//
//.............выполнено студентом гр.8и12 ...............//
//...................Окунев Дмитрий.......................//
////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace mosaic
{
    
    public partial class FormMain : Form// Класс главной формы, размещает на себе элементы управления - панель, прямоугольники PictureBox.
    {
        public FormMain()
        {
            InitializeComponent();

            
        }

        
        PictureBox[] PB = null;// Массив объектов прямоугольников для хранения сегментов картинки.
        
        int LengthSides = 3;// Длина стороны в прямоугольниках.
        
        Bitmap Picture = null;// Объект хранения картинки.

        
        void CreatePictureRegion()
        {
           
            if (PB != null)
            {
                for (int i = 0; i < PB.Length; i++)
                {
                    PB[i].Dispose();
                }
                PB = null;
            }
            
            
            int num = LengthSides;
            // Создаем массив прямоугольников размером LengthSides Х LengthSides.
            PB = new PictureBox[num * num];
            
            // Вычислим габаритные размеры прямоугольников.
            int w = panel1.Width / num;
            int h = panel1.Height / num;

            int countX = 0; // счетчик прямоугольников по координате Х в одном ряду.
            int countY = 0; // счетчик прямоуголников по координате Y в одном столбце.
            for (int i = 0; i < PB.Length; i++)
            {
                PB[i] = new PictureBox(); // Создание прямоугольника, элемента массива

                // Размеры и координаты размещения созданного прямоугольника.
                PB[i].Width = w;
                PB[i].Height = h;
                PB[i].Left = 0 + countX * PB[i].Width;
                PB[i].Top = 0 + countY * PB[i].Height;

                // Запомним начальные координаты прямоугольника для  восстановления перемешанной картинки.
               
                Point pt = new Point();
                pt.X = PB[i].Left;
                pt.Y = PB[i].Top;
                PB[i].Tag = pt; 

                // Считаем прямоугольники по рядам и столбцам.
                countX++;
                if (countX == num)
                {
                    countX = 0;
                    countY++;
                }


                PB[i].Parent = panel1; // разместим прямоугольники на панели
                PB[i].BorderStyle = BorderStyle.None;
                PB[i].SizeMode = PictureBoxSizeMode.StretchImage; // размеры картинки будут подгоняться под размеры прямоугольника
                PB[i].Show(); // гарантия видимости прямоугольника

                
                PB[i].Click += new EventHandler(PB_Click); 
            }

            // Раскидываем картинку на сегменты и рисуем каждый сегмент на своем прямоугольнике.
            DrawPicture();
            
        }

        void DrawPicture()
        {
            if (Picture == null) return;
            int countX = 0;
            int countY = 0;
            int num = LengthSides;
            for (int i = 0; i < PB.Length; i++)
            {
                int w = Picture.Width / num;
                int h = Picture.Height / num;
                PB[i].Image = Picture.Clone(new RectangleF(countX * w, countY * h, w, h), Picture.PixelFormat);
                countX++;
                if (countX == LengthSides)
                {
                    countX = 0;
                    countY++;
                }

            }
        }

      

        // Открытие диалогового окна выбора файла и создание новой области прорисовки картинки.
        private void toolStripButtonLoadPicture_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofDlg = new OpenFileDialog();
            // Фильтр показа только файлов с определенным расширением.
            ofDlg.Filter = "файлы картинок (*.bmp;*.jpg;*.jpeg;)|*.bmp;*.jpg;.jpeg|All files (*.*)|*.*";
            ofDlg.FilterIndex = 1;
            ofDlg.RestoreDirectory = true;

            if (ofDlg.ShowDialog() == DialogResult.OK)
            {
                // Загружаем выбранную картинку.
                Picture = new Bitmap(ofDlg.FileName);
           
                CreatePictureRegion();
            }
        }

        
        private void toolStripButtonMixed_Click(object sender, EventArgs e)
        {
            if (Picture == null) return;

            
            Random rand = new Random(Environment.TickCount);
            int r = 0;
            for (int i = 0; i < PB.Length; i++)
            {
                PB[i].Visible = true;
                r = rand.Next(0, PB.Length);
                Point ptR = PB[r].Location;
                Point ptI = PB[i].Location;
                PB[i].Location = ptR;
                PB[r].Location = ptI;
                PB[i].BorderStyle = BorderStyle.FixedSingle;
            }

            
            r = rand.Next(0, PB.Length);// Случайным образом выбираем пустой прямоугольник, делаем его невидимым.
            PB[r].Visible = false;
           
        }


        
        

        // Восстанавливаем картинку соответсвенно первичным координатам.
        private void toolStripButtonRestore_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < PB.Length; i++)
            {
                Point pt = (Point)PB[i].Tag;
                PB[i].Location = pt;
                PB[i].Visible = true;
            }
        }

        // Открываем диалоговое окно настроек приложения.
        private void toolStripButtonSetting_Click(object sender, EventArgs e)
        {
            SetDlg setDlg = new SetDlg();
            setDlg.LengthSides = LengthSides;
            if (setDlg.ShowDialog() == DialogResult.OK)
            {
                LengthSides = setDlg.LengthSides;

                
                CreatePictureRegion();
            }
        }

        // Открываем диалоговое окно с нормальным видом картинки,

        private void toolStripButtonHelp_Click(object sender, EventArgs e)
        {
            HelpDlg helpDlg = new HelpDlg();
            helpDlg.ImageDuplicate = Picture;
            helpDlg.ShowDialog();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {

        }



        
    }
}
